package com.xs.ai.services;

import com.xs.ai.dto.MeetingAnalysisResult;
import com.xs.ai.entity.CalendarEvent;
import com.xs.ai.entity.User;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDate;
import java.util.List;

@Slf4j
@Service
@RequiredArgsConstructor
public class CalendarOptimizationService {
    
    private final ChatClient chatClient;
    private final CalendarEventRepository eventRepository;
    private final ContactImportanceService contactImportanceService;
    
    /**
     * 分析会议请求并提供建议
     */
    public MeetingAnalysisResult analyzeMeetingRequest(
            CalendarEvent meeting, User user) {
        
        log.info("分析会议请求: {}", meeting.getTitle());
        
        // 1. 检查时间冲突
        List<CalendarEvent> conflicts = findConflicts(meeting, user.getId());
        
        // 2. 分析参会人重要性
        List<AttendeeImportance> attendeeImportance = 
            analyzeAttendees(meeting.getAttendees(), user.getId());
        
        // 3. 获取用户当天其他安排
        List<CalendarEvent> daySchedule = 
            getDaySchedule(user.getId(), meeting.getStartTime());
        
        // 4. 构建AI提示词
        String prompt = buildMeetingAnalysisPrompt(
            meeting, conflicts, attendeeImportance, daySchedule);
        
        // 5. 调用AI分析
        String aiResponse = chatClient.call(new Prompt(new UserMessage(prompt)));
        
        return parseMeetingAnalysis(aiResponse);
    }
    
    private String buildMeetingAnalysisPrompt(
            CalendarEvent meeting,
            List<CalendarEvent> conflicts,
            List<AttendeeImportance> attendeeImportance,
            List<CalendarEvent> daySchedule) {
        
        return String.format("""
            你是CEO的日程管理助理。请分析这个会议邀请并提供建议。
            
            ## 会议信息
            主题: %s
            时间: %s - %s
            组织者: %s
            参会人数: %d
            会议描述: %s
            
            ## 参会人重要性分析
            %s
            
            ## 时间冲突检测
            %s
            
            ## 当天其他安排
            %s
            
            ## 分析要求
            请以JSON格式返回，不要包含markdown标记:
            
            {
              "recommendation": "accept | decline | tentative | reschedule",
              "recommendationReason": "详细理由",
              "importanceScore": 0.0-1.0,
              "category": "strategic | operational | routine | networking | internal",
              "canDelegate": true/false,
              "suggestedDelegate": "如果可以委托，建议委托给谁",
              "alternativeTimes": [
                {
                  "start": "ISO时间",
                  "end": "ISO时间",
                  "reason": "为什么这个时间更好"
                }
              ],
              "preparationNeeded": {
                "documents": ["需要准备的文档1", "需要准备的文档2"],
                "backgroundInfo": "需要了解的背景信息",
                "keyQuestions": ["可能需要讨论的关键问题1", "问题2"]
              },
              "estimatedValue": "这个会议的预期价值评估",
              "timeManagementImpact": "对整天时间安排的影响分析",
              "confidenceScore": 0.0-1.0
            }
            
            决策标准:
            1. 如果有高重要性参会人(评分>0.8)，倾向于accept
            2. 如果与重要会议冲突，建议reschedule
            3. 如果是例行会议且可委托，建议delegate
            4. 考虑CEO的深度工作时间保护
            5. 避免连续会议超过3小时
            """,
            meeting.getTitle(),
            meeting.getStartTime(),
            meeting.getEndTime(),
            meeting.getOrganizerEmail(),
            meeting.getAttendees().size(),
            meeting.getDescription(),
            formatAttendeeImportance(attendeeImportance),
            formatConflicts(conflicts),
            formatDaySchedule(daySchedule)
        );
    }
    
    /**
     * 优化一周的日程安排
     */
    public WeekOptimizationResult optimizeWeekSchedule(User user, LocalDate weekStart) {
        List<CalendarEvent> weekEvents = 
            eventRepository.findByUserAndWeek(user.getId(), weekStart);
        
        String prompt = String.format("""
            你是专业的时间管理顾问。请分析CEO的本周日程并提供优化建议。
            
            ## 本周安排概况
            %s
            
            ## 分析维度
            1. 会议密度分析（是否过于密集）
            2. 深度工作时间保护（是否有足够的专注时间）
            3. 会议聚集优化（减少时间碎片化）
            4. 通勤时间考虑（现场会议之间的移动时间）
            5. 休息时间安排（避免连续高强度会议）
            
            ## 要求
            请以JSON格式返回优化建议:
            
            {
              "overallAssessment": "整体时间安排评估",
              "workloadScore": 0.0-1.0 (工作负荷评分，0.8+为过载),
              "focusTimeHours": 实际深度工作时间,
              "recommendedFocusTimeHours": 建议的深度工作时间,
              "optimizations": [
                {
                  "type": "reschedule | merge | delegate | cancel | add_buffer",
                  "eventId": "相关会议ID",
                  "currentTime": "当前时间",
                  "suggestedTime": "建议时间",
                  "reason": "优化理由",
                  "priority": "high | medium | low"
                }
              ],
              "focusTimeBlocks": [
                {
                  "day": "星期",
                  "start": "开始时间",
                  "end": "结束时间",
                  "protected": true
                }
              ],
              "warnings": ["警告信息1", "警告信息2"],
              "energyManagement": "关于精力管理的建议"
            }
            """,
            formatWeekSchedule(weekEvents)
        );
        
        String aiResponse = chatClient.call(new Prompt(new UserMessage(prompt)));
        return parseWeekOptimization(aiResponse);
    }
    
    // 辅助方法...
    private List<CalendarEvent> findConflicts(CalendarEvent meeting, Long userId) {
        return eventRepository.findConflicts(
            userId, 
            meeting.getStartTime(), 
            meeting.getEndTime()
        );
    }
}